/*
* JBoss, Home of Professional Open Source
* Copyright 2014 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @authors tag. All rights reserved.
*/
package org.jboss.elasticsearch.river.remote;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
/**
* Unit test for {@link CronExpression}. Taken from
* http://svn.terracotta.org/svn/quartz/trunk/quartz-core/src/test/java/org/quartz/CronExpressionTest.java and adapted
* to jUnit 4.
*
* @author Vlastimil Elias (velias at redhat dot com)
*/
public class CronExpressionTest {
private static final TimeZone EST_TIME_ZONE = TimeZone.getTimeZone("US/Eastern");
/*
* Test method for 'org.quartz.CronExpression.isSatisfiedBy(Date)'.
*/
@Test
public void testIsSatisfiedBy() throws Exception {
CronExpression cronExpression = new CronExpression("0 15 10 * * ? 2005");
Calendar cal = Calendar.getInstance();
cal.set(2005, Calendar.JUNE, 1, 10, 15, 0);
assertTrue(cronExpression.isSatisfiedBy(cal.getTime()));
cal.set(Calendar.YEAR, 2006);
assertFalse(cronExpression.isSatisfiedBy(cal.getTime()));
cal = Calendar.getInstance();
cal.set(2005, Calendar.JUNE, 1, 10, 16, 0);
assertFalse(cronExpression.isSatisfiedBy(cal.getTime()));
cal = Calendar.getInstance();
cal.set(2005, Calendar.JUNE, 1, 10, 14, 0);
assertFalse(cronExpression.isSatisfiedBy(cal.getTime()));
}
@Test
public void testLastDayOffset() throws Exception {
CronExpression cronExpression = new CronExpression("0 15 10 L-2 * ? 2010");
Calendar cal = Calendar.getInstance();
cal.set(2010, Calendar.OCTOBER, 29, 10, 15, 0); // last day - 2
assertTrue(cronExpression.isSatisfiedBy(cal.getTime()));
cal.set(2010, Calendar.OCTOBER, 28, 10, 15, 0);
assertFalse(cronExpression.isSatisfiedBy(cal.getTime()));
cronExpression = new CronExpression("0 15 10 L-5W * ? 2010");
cal.set(2010, Calendar.OCTOBER, 26, 10, 15, 0); // last day - 5
assertTrue(cronExpression.isSatisfiedBy(cal.getTime()));
cronExpression = new CronExpression("0 15 10 L-1 * ? 2010");
cal.set(2010, Calendar.OCTOBER, 30, 10, 15, 0); // last day - 1
assertTrue(cronExpression.isSatisfiedBy(cal.getTime()));
cronExpression = new CronExpression("0 15 10 L-1W * ? 2010");
cal.set(2010, Calendar.OCTOBER, 29, 10, 15, 0); // nearest weekday to last day - 1 (29th is a friday in 2010)
assertTrue(cronExpression.isSatisfiedBy(cal.getTime()));
}
/*
* QUARTZ-571: Showing that expressions with months correctly serialize.
*/
@Test
public void testQuartz571() throws Exception {
CronExpression cronExpression = new CronExpression("19 15 10 4 Apr ? ");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(cronExpression);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
CronExpression newExpression = (CronExpression) ois.readObject();
assertEquals(newExpression.getCronExpression(), cronExpression.getCronExpression());
// if broken, this will throw an exception
newExpression.getNextValidTimeAfter(new Date());
}
/**
* QTZ-259 : last day offset causes repeating fire time
*
*/
@Test
public void testQtz259() throws Exception {
CronExpression trigger = new CronExpression("0 0 0 L-2 * ? *");
int i = 0;
Date pdate = trigger.getNextValidTimeAfter(new Date());
while (++i < 26) {
Date date = trigger.getNextValidTimeAfter(pdate);
// System.out.println("fireTime: " + date + ", previousFireTime: " + pdate);
assertFalse("Next fire time is the same as previous fire time!", pdate.equals(date));
pdate = date;
}
}
/**
* QTZ-259 : last day offset causes repeating fire time
*
*/
@Test
public void testQtz259LW() throws Exception {
CronExpression trigger = new CronExpression("0 0 0 LW * ? *");
int i = 0;
Date pdate = trigger.getNextValidTimeAfter(new Date());
while (++i < 26) {
Date date = trigger.getNextValidTimeAfter(pdate);
// System.out.println("fireTime: " + date + ", previousFireTime: " + pdate);
assertFalse("Next fire time is the same as previous fire time!", pdate.equals(date));
pdate = date;
}
}
/*
* QUARTZ-574: Showing that storeExpressionVals correctly calculates the month number
*/
@Test
public void testQuartz574() {
try {
new CronExpression("* * * * Foo ? ");
fail("Expected ParseException did not fire for non-existent month");
} catch (ParseException pe) {
assertTrue("Incorrect ParseException thrown", pe.getMessage().startsWith("Invalid Month value:"));
}
try {
new CronExpression("* * * * Jan-Foo ? ");
fail("Expected ParseException did not fire for non-existent month");
} catch (ParseException pe) {
assertTrue("Incorrect ParseException thrown", pe.getMessage().startsWith("Invalid Month value:"));
}
}
@Test
public void testQuartz621() {
try {
new CronExpression("0 0 * * * *");
fail("Expected ParseException did not fire for wildcard day-of-month and day-of-week");
} catch (ParseException pe) {
assertTrue(
"Incorrect ParseException thrown",
pe.getMessage().startsWith(
"Support for specifying both a day-of-week AND a day-of-month parameter is not implemented."));
}
try {
new CronExpression("0 0 * 4 * *");
fail("Expected ParseException did not fire for specified day-of-month and wildcard day-of-week");
} catch (ParseException pe) {
assertTrue(
"Incorrect ParseException thrown",
pe.getMessage().startsWith(
"Support for specifying both a day-of-week AND a day-of-month parameter is not implemented."));
}
try {
new CronExpression("0 0 * * * 4");
fail("Expected ParseException did not fire for wildcard day-of-month and specified day-of-week");
} catch (ParseException pe) {
assertTrue(
"Incorrect ParseException thrown",
pe.getMessage().startsWith(
"Support for specifying both a day-of-week AND a day-of-month parameter is not implemented."));
}
}
@Test
public void testQuartz640() throws ParseException {
try {
new CronExpression("0 43 9 1,5,29,L * ?");
fail("Expected ParseException did not fire for L combined with other days of the month");
} catch (ParseException pe) {
assertTrue(
"Incorrect ParseException thrown",
pe.getMessage().startsWith(
"Support for specifying 'L' and 'LW' with other days of the month is not implemented"));
}
try {
new CronExpression("0 43 9 ? * SAT,SUN,L");
fail("Expected ParseException did not fire for L combined with other days of the week");
} catch (ParseException pe) {
assertTrue("Incorrect ParseException thrown",
pe.getMessage().startsWith("Support for specifying 'L' with other days of the week is not implemented"));
}
try {
new CronExpression("0 43 9 ? * 6,7,L");
fail("Expected ParseException did not fire for L combined with other days of the week");
} catch (ParseException pe) {
assertTrue("Incorrect ParseException thrown",
pe.getMessage().startsWith("Support for specifying 'L' with other days of the week is not implemented"));
}
try {
new CronExpression("0 43 9 ? * 5L");
} catch (ParseException pe) {
fail("Unexpected ParseException thrown for supported '5L' expression.");
}
}
@Test
public void testQtz96() throws ParseException {
try {
new CronExpression("0/5 * * 32W 1 ?");
fail("Expected ParseException did not fire for W with value larger than 31");
} catch (ParseException pe) {
assertTrue("Incorrect ParseException thrown",
pe.getMessage().startsWith("The 'W' option does not make sense with values larger than"));
}
}
@Test
public void testQtz395_CopyConstructorMustPreserveTimeZone() throws ParseException {
TimeZone nonDefault = TimeZone.getTimeZone("Europe/Brussels");
if (nonDefault.equals(TimeZone.getDefault())) {
nonDefault = EST_TIME_ZONE;
}
CronExpression cronExpression = new CronExpression("0 15 10 * * ? 2005");
cronExpression.setTimeZone(nonDefault);
CronExpression copyCronExpression = new CronExpression(cronExpression);
assertEquals(nonDefault, copyCronExpression.getTimeZone());
}
}